const multer = require('multer');
const path = require('path');
const fs = require('fs');

// 确保上传目录存在
const uploadDir = path.join(__dirname, '../../uploads');
if (!fs.existsSync(uploadDir)) {
  fs.mkdirSync(uploadDir, { recursive: true });
}

// 配置存储
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, uploadDir);
  },
  filename: function (req, file, cb) {
    // 创建唯一文件名
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    // 获取原始扩展名
    const ext = path.extname(file.originalname);
    // 不使用原始文件名，只使用唯一标识符作为文件名
    cb(null, file.fieldname + '-' + uniqueSuffix + ext);
  }
});

// 文件过滤器
const fileFilter = (req, file, cb) => {
  // 允许的文件类型
  const allowedFileTypes = ['.pdf', '.docx', '.txt', '.html'];
  const ext = path.extname(file.originalname).toLowerCase();
  
  if (allowedFileTypes.includes(ext)) {
    cb(null, true);
  } else {
    cb(new Error('不支持的文件类型。请上传 PDF、DOCX、TXT 或 HTML 文件。'), false);
  }
};

// 创建上传中间件
const upload = multer({ 
  storage: storage,
  fileFilter: fileFilter,
  limits: {
    fileSize: 50 * 1024 * 1024, // 限制文件大小为50MB
  }
});

/**
 * 清理孤立的上传文件
 * @returns {Promise<{deleted: number, errors: number, files: string[]}>} 清理结果
 */
const cleanupOrphanedFiles = async () => {
  const Document = require('../models/Document');
  const result = {
    deleted: 0,
    errors: 0,
    files: []
  };

  try {
    if (!fs.existsSync(uploadDir)) {
      return result;
    }

    const files = fs.readdirSync(uploadDir);
    
    for (const file of files) {
      const filePath = path.join(uploadDir, file);
      
      // 检查文件是否是文件而不是目录
      if (fs.statSync(filePath).isFile()) {
        // 检查文件是否存在于数据库中
        const fileInDb = await Document.findOne({ filePath });
        
        if (!fileInDb) {
          try {
            fs.unlinkSync(filePath);
            result.deleted++;
            result.files.push(filePath);
            console.log(`孤立文件已删除: ${filePath}`);
          } catch (error) {
            result.errors++;
            console.error(`删除孤立文件失败: ${filePath}`, error);
          }
        }
      }
    }
    
    return result;
  } catch (error) {
    console.error('清理孤立文件时出错:', error);
    throw error;
  }
};

/**
 * 获取上传目录路径
 * @returns {string} 上传目录的绝对路径
 */
const getUploadDir = () => {
  return uploadDir;
};

// 导出模块
module.exports = upload;
module.exports.cleanupOrphanedFiles = cleanupOrphanedFiles;
module.exports.getUploadDir = getUploadDir; 